package com.dataex.dbtool;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 集合工具类
 */
public class ImpCollUtil extends org.apache.commons.collections.CollectionUtils {
	
	
	/**
	 * 得到消除了重复的List集合对象
	 * @param originList 传入的集合对象
	 * @return 消除重复后的集合对象
	 */
	public static List<String> getNoRepeatList(List<String> originList){
		if(originList == null){
			throw new IllegalArgumentException("传入的集合对象不能为空!");
		}
		Set<String> set = new HashSet<String>(originList);
		originList = new ArrayList<String>(set);
		return originList;
	}
	public static <T> List<T> getNoRepeat(List<T> originList){
		if(originList == null){
			throw new IllegalArgumentException("传入的集合对象不能为空!");
		}
		Set<T> set = new HashSet<T>(originList);
		originList = new ArrayList<T>(set);
		return originList;
	}
	
	
	/**
	 * 将集合中的元素根据制定的分隔符进行分割
	 * @param list 要分割的集合
	 * @param splitStr 分割的字符串
	 * @return 最后组合成的字符串
	 */
	public static String getStringFromListBySplit(List<?> list,String splitStr){
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<list.size();i++){
			sb.append(list.get(i));
			if(i!=list.size()-1){
				sb.append(splitStr);
			}
		}
		return sb.toString();
	}
		
	
	/**
	 * 将集合中的元素根据默认的分隔符(,)进行分割
	 * @param list 要分割的集合
	 * @return 最后组合成的字符串
	 */
	public static String getStringFromListByDefalutSplit(List<?> list){
		return getStringFromListBySplit(list, ",");
	}
	
	
	/**
	 * 将集合转化为通过制定字符连接的字符串
	 * @param list 要转化的集合
	 * @return 生成的字符串
	 */
	public static String splitListToString(List<String> list){
		return getStringFromListBySplit(list, ",");
	}

	
	
	/** 如果fieldName为空：将list中的sublist元素删除。如果e出现在sublist,则需要从list去除
	 *  否则按fieldName属性去重
	 * @param <T>
	 * @param list
	 * @param sublist
	 * @param fieldName
	 */
	public static <T> void filtList(List<T> list, List<T> sublist) {
		ArrayList<T> llist = new ArrayList<T>(list);
		for (T e : llist)
			if (sublist.indexOf(e) >= 0)
				list.remove(e);
	}
	
	public static <T, M> void mapTo2List(Map<T,M> map, List<T> keyList, List<M> valList){
		for(Map.Entry<T, M> entry:map.entrySet()){    
			keyList.add(entry.getKey());
			valList.add(entry.getValue());
		}   
	}
	
	public static <T> Set<T> ListToSet(List<T> list){
		Set<T> set = new HashSet<T>();
		for (T t : list){
			set.add(t);
		}
		return set;
	}
	
	public static <T> List<T> SetToList(Set<T> set){
		List<T> list = new ArrayList<T>();
		for (T t : set){
			list.add(t);
		}
		return list;
	}
	
	public static <T> T getSetByIndex(Set<T> set, int index){
		if (set == null || set.size() == 0 || set.size() >(index+1)) {
			return null;
		}
		T obj = null;
		Iterator<T> iter = set.iterator();
		while ( index-- >= 0 && iter.hasNext() ){
			obj = iter.next();
		}
		return obj;
	}
	
	
	public static <T> Set<T> getSetIntersection(Set<T> set1, Set<T> set2){
		Set<T> result = new HashSet<T>();
		if ( set1 ==null || set2 == null )
			return result;
		result.addAll(set1);
        result.retainAll(set2);
        return result;
	}
	
	/**
	 * 随机获取list中size个元素，组成list返回。与源串中顺序不一致.时间在微秒级
	 * @param <T> 模版类型
	 * @param list 原始list
	 * @param size 要获取的随机串长度
	 * @return 随机组成的list.
	 */
	public static <T>List<T> getRangeList(List<T> list, int size) {
		Collections.shuffle(list);
		ArrayList<T> llist = new ArrayList<T>(list.subList(0, size));		
		return llist;
	}
	
	
	/**
	 * 删除重复数据
	 * @param <T>
	 * @param objs 传入的数据集合,一般是数据库中查询出来的集合对象,传入的集合不能为空
	 * @param callback 删除时调用的callback方法
	 * @return 返回不是重复的集合
	 */
	public static <T> List<T> deleteRepeat(List<T> objs,IRepeatDeleteCallBack callback){
		Set<T> set = new HashSet<T>();
		for (T t : objs) {
			if(!set.add(t)){
				callback.delete(t);
			}
		}
		return getNoRepeat(objs);
	}
	
	
	/**
	 * 删除重复数据的callback接口
	 * 
	 * @author hongliuliao
	 *
	 * CreateDate:2011-8-23 下午12:57:17
	 */
	public interface IRepeatDeleteCallBack{
		/**
		 * 对重复数据的处理,一般是删除
		 * @param <T>
		 * @param obj 要删除的对象
		 * @return 是否删除成功
		 */
		public <T> boolean delete(T obj);
	}
	
	
	/**
	 * 移除空元素
	 * @param <T>
	 * @param list
	 */
	public static <T> void removeNullElement(List<T> list){
		if(org.apache.commons.collections.CollectionUtils.isEmpty(list)) {
			return ;
		}
		Iterator<T> i = list.iterator();
		while(i.hasNext()) {
			T t = i.next();
			if(t == null) {
				i.remove();
			}
		}
	}
	
	static public boolean isNullColl(Collection<?> list) {
		return list == null || list.size() == 0;
	}
	
	static public boolean isNullMap(Map<?, ?> map){
		return map == null || map.size() == 0;
	}
	
	static public String getCollSizeStr(Collection<?> list){
		if ( list == null )
			return null;
		return list.size()+"";
	}
	
	static public String getMapSizeStr(Map<?, ?> map){
		if ( map == null )
			return null;
		return map.size()+"";
	}
		
	public static <T extends Comparable<Integer>> int binarySearch(ArrayList<T> arr, int nStart, int nEnd, Integer val, Ref<T> obj){
		
		if ( arr ==null || arr.size() == 0 )
			return -1;

		int nIndex = ( nStart + nEnd ) / 2;		
		int nCmp = arr.get(nIndex).compareTo((Integer) val);

		//找到
		if (  nCmp ==0  )
		{
			obj.c = nIndex;
			obj.v = arr.get(nIndex);
			return 0;
		}
		else if ( nCmp > 0 ) // 大于 val 
		{
			//保存节点
			obj.c = nIndex;
			obj.v = arr.get(nIndex);
			nIndex --;
			if ( nIndex < nStart ) //无
				return 1;
			binarySearch( arr, nStart, nIndex, val, obj);
		}
		else // 小于 val 
		{
			nIndex ++ ;
			if ( nIndex > nEnd ) //无
				return -1;
			binarySearch( arr, nIndex, nEnd, val, obj);
		}		
		return -1;
	}
}
